//----------------------------------*-C++-*----------------------------------//
/*!
 * \file   Uniform_Equal_3D.hh
 * \author Jeremy Roberts
 * \date   06/19/2011
 * \brief  Uniform_Equal_3D class definition.
 * \note   Copyright (C) 2011 Jeremy Roberts
 */
//---------------------------------------------------------------------------//
// $Rev::                                               $:Rev of last commit
// $Author::                                            $:Author of last commit
// $Date::                                              $:Date of last commit
//---------------------------------------------------------------------------//

#ifndef UNIFORM_EQUAL_3D_HH
#define UNIFORM_EQUAL_3D_HH

#include "angle/Quadrature.hh"

namespace slabtran
{

//===========================================================================//
/*!
 * \class Uniform_Equal_3D
 * \brief 2D/3D Uniform, Equal Weight (UEn) quadrature class.
 *
 * As mentioned in \ref Level_Symmetric_3D, a fundamental problem inherent
 * to LQn quadrature is presence of negative weights at high order.  These
 * weights produce unphysical solutions (and may inhibit convergence).  For
 * problems where an increased quadrature order (i.e. more angles) is
 * required to study convergence or simply to get better answers, we
 * require an arbitrarily high order, positive weight quadrature.
 *
 * Here, we implement the "uniform, equal weight" (UEn) quadrature of Carew
 * and Zamonsky.
 *
 * To be completed.
 *
 * For 2D calculations, only \f$ \mu \f$ and \f$ \eta \f$ values are
 * used and represent a symmetric set.
 *
 * \refs
 * - Carew, J. and Zamonsky. G., <em>Nuclear Science and Engineering</em>
 *     <b>131</b>, 199-207 (1999).
 *
 */
/*!
 * \example test/testUniform_Equal_3D.cc
 *
 * Test of Uniform_Equal_3D.
 */
//===========================================================================//
class Uniform_Equal_3D : public Quadrature<_3D>
{
  private:
    //! Base class typedef.
    typedef Quadrature<_3D> Base;

  public:
    // Constructor.
    Uniform_Equal_3D(int sn_order, double norm, bool uniform_xi=true);

    // Display the quadrature.
    //void display() const;

    // Print quadrature type
    void name() const { std::cout << "UEn 3D..." << std::endl; } ;
};

class Uniform_Equal_2D : public Quadrature<_2D>
{
  private:
    //! Base class typedef.
    typedef Quadrature<_2D> Base;

  public:
    // Constructor.
    Uniform_Equal_2D(int sn_order, double norm, bool uniform_xi=true);

    // Display the quadrature.
    //void display() const;

    // Print quadrature type
    void name() const { std::cout << "UEn 2D..." << std::endl; } ;
};

} // end namespace slabtran

#endif // UNIFORM_EQUAL_3D_HH

//---------------------------------------------------------------------------//
//              end of Uniform_Equal_3D.hh
//---------------------------------------------------------------------------//
